home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / bitmap.st < prev    next >
Text File  |  1993-07-24  |  7KB  |  208 lines

  1. "    NAME        bitmap
  2.     AUTHOR        IKP@cs.man.ac.uk
  3.     FUNCTION PostScript image stmts or Sun raster files -> forms 
  4.     ST-VERSIONS    2.2
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989
  10. SUMMARY    bitmap
  11.     provides methods to instantiate forms from PostScript image
  12.     definitions or Sun raster files.  This early attempt ignores
  13.     the image transformation matrix in the PostScript, and can
  14.     only cope with 1 bit/pixel images.  Non-raw raster files
  15.     (i.e. run-length encoded files) are detected and complained
  16.     about appropriately.  PostScript files should contain a single
  17.     ``image'' statement only:
  18.     width height bits-per-pixel [xform-matrix] {<lots-of-hex>} image
  19.     (2.2). IKP
  20. "!
  21. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 17 June 1988 at 10:45:24 am'!
  22.  
  23.  
  24.  
  25. !ExternalStream methodsFor: 'nonhomogeneous positioning'!
  26.  
  27. skipBlanks 
  28.     "Skip upto and excluding the next non-blank char."
  29.  
  30.     [self next asciiValue < 33] whileTrue.
  31.     self skip: -1! !'From Smalltalk-80, Version 2.2 of July 4, 1987 on 17 June 1988 at 10:45:36 am'!
  32.  
  33.  
  34.  
  35. !ExternalStream methodsFor: 'nonhomogeneous positioning'!
  36.  
  37. skipPSBlanks
  38.     "Skip upto and excluding the next non-blank char. Ignore lines starting 
  39.      with PostScript comment char."
  40.  
  41.     | c |
  42.     self skipBlanks.
  43.     self next == $%
  44.         ifTrue: 
  45.             [[( c _ self next asciiValue) == 13 or: [c == 10]] whileFalse.
  46.             self skipPSBlanks]
  47.         ifFalse: [self skip: -1]! !'From Smalltalk-80, Version 2.2 of July 4, 1987 on 17 June 1988 at 10:45:43 am'!
  48.  
  49.  
  50.  
  51. !ExternalStream methodsFor: 'nonhomogeneous positioning'!
  52.  
  53. skipToChar: char 
  54.     "Skip upto and including the next occurence of char."
  55.  
  56.     | c |
  57.     [(c _ self next) isNil or: [c == char]] whileFalse! !'From Smalltalk-80, Version 2.2 of July 4, 1987 on 17 June 1988 at 10:45:53 am'!
  58.  
  59.  
  60.  
  61. !ExternalStream methodsFor: 'nonhomogeneous accessing'!
  62.  
  63. nextDecimal
  64.     "Read and answer the next ascii-encoded decimal number as a 
  65.     positive Integer."
  66.  
  67.     | n v |
  68.     n _ 0.
  69.     [(v _ self next digitValue) >= 0]
  70.         whileTrue: [n _ n * 10 + v].
  71.     self skip: -1.
  72.     ^n! !'From Smalltalk-80, Version 2.2 of July 4, 1987 on 17 June 1988 at 10:46:07 am'!
  73.  
  74.  
  75.  
  76. !ExternalStream methodsFor: 'nonhomogeneous accessing'!
  77.  
  78. nextHexByte
  79.     "Read and answer the next ascii-encoded hexadecimal byte as a 
  80.     positive Integer."
  81.  
  82.     ^ (self next digitValue bitShift: 4) + (self next digitValue)! !'From Smalltalk-80, Version 2.2 of July 4, 1987 on 17 June 1988 at 10:46:12 am'!
  83.  
  84.  
  85.  
  86. !ExternalStream methodsFor: 'nonhomogeneous accessing'!
  87.  
  88. nextHexWord
  89.     "Read and answer the next ascii-encoded hexadecimal byte as a  
  90.     positive Integer."
  91.  
  92.     ^(self next digitValue bitShift: 12)
  93.         + (self next digitValue bitShift: 8) + (self next digitValue bitShift: 4) + self next digitValue! !'From Smalltalk-80, Version 2.2 of July 4, 1987 on 17 June 1988 at 10:46:46 am'!
  94.  
  95.  
  96.  
  97. !Form class methodsFor: 'instance creation'!
  98.  
  99. readPostScriptImageFile: file 
  100.     "Answer an instance of the receiver with bitmap initialized from the  
  101.     external file.    
  102.     The file format is: <width> <height> <density> [<matrix>] {<hex>}  
  103.     image."
  104.  
  105.     | newForm bitsWidth bitsHeight psWidth psHeight psDensity theBits bitPosition bitBin odd |
  106.     file readOnly; text.
  107.     newForm _ self new.
  108.     file skipPSBlanks.    psWidth _ file nextDecimal.
  109.     file skipPSBlanks.    psHeight _ file nextDecimal.
  110.     file skipPSBlanks.    psDensity _ file nextDecimal.
  111.     file skipToChar: $<.
  112.     bitsWidth _ psWidth + 15 // 16.
  113.     bitsHeight _ psHeight.
  114.     odd _ (psWidth + 7 // 8) odd.
  115.     newForm extent: (psWidth @ psHeight); offset: 0 @ 0.
  116.     theBits _ WordArray new: bitsWidth * bitsHeight.
  117.     bitPosition _ 0.
  118.     1 to: bitsHeight do: 
  119.         [:j | 
  120.         file skipBlanks.
  121.         1 to: bitsWidth - 1 do: [:i | theBits at: (bitPosition _ bitPosition + 1) put: file nextHexWord].
  122.         odd ifTrue: ["last byte of line"
  123.             theBits at: (bitPosition _ bitPosition + 1) put: file nextHexByte]].
  124.     newForm bits: theBits.
  125.     file close.
  126.     ^newForm reverse
  127.  
  128. "BUGS:  
  129.     Only copes with 1 bit/sample monochrome images."! !'From Smalltalk-80, Version 2.2 of July 4, 1987 on 17 June 1988 at 10:46:53 am'!
  130.  
  131.  
  132.  
  133. !Form class methodsFor: 'instance creation'!
  134.  
  135. readRasterFile: file 
  136.  
  137.     "Answer an instance of the receiver with bitmap initialized from the  
  138.     external raster file.    
  139.     The file format is: <magic> <width> <height> <depth> <length> <type> <maptype> <maplength> <map...>."
  140.  
  141.     | newForm bitsWidth bitsHeight rasWidth rasHeight rasDensity rasType mapType theBits bitPosition bitBin |
  142.     file readOnly; binary.
  143.     newForm _ self new.
  144.     file nextLong ~= 16r59A66A95 ifTrue: [self error: 'Bad magic number'].
  145.     rasWidth _ file nextLong.
  146.     rasHeight _ file nextLong.
  147.     rasDensity _ file nextLong.
  148.     file nextLong. "length"
  149.     (rasType _ file nextLong) > 1 ifTrue: [self error: 'Bad rasterfile type (may be encoded): ', rasType printString].
  150.     mapType _ file nextLong.
  151.     ((mapType ~= 2) and: [mapType ~= 0]) ifTrue: [self error: 'Bad map type (not raw): ', mapType printString].
  152.     file nextLong. "maplength"
  153.     bitsWidth _ rasWidth + 15 // 16.
  154.     bitsHeight _ rasHeight.
  155.     newForm extent: (rasWidth @ rasHeight); offset: 0 @ 0.
  156.     theBits _ WordArray new: bitsWidth * bitsHeight.
  157.     bitPosition _ 0.
  158.     1 to: bitsHeight do: 
  159.         [:j | 
  160.         1 to: bitsWidth do: [:i | theBits at: (bitPosition _ bitPosition + 1) put: file nextWord]].
  161.     newForm bits: theBits.
  162.     file close.
  163.     ^newForm 
  164.  
  165. "BUGS:  
  166.     Only copes with 1 bit/sample monochrome images."
  167.  
  168.  
  169. "
  170. Description of header for files containing raster images:
  171.  
  172.     magic        magic number 16r59A66A95
  173.     width        width (pixels) of image
  174.     height        height (pixels) of image
  175.     depth        depth (1, 8, or 24 bits) of pixel
  176.     length        length (bytes) of image
  177.     type        type of file - see below
  178.     maptype    type of colormap see below
  179.     maplength    length (bytes) of following map
  180.  
  181.         color map follows for maplength bytes, followed by image 
  182.  
  183. Sun supported type's
  184.  
  185.     Old                0            Raw pixrect image in 68000 byte order
  186.     Standard        1            Raw pixrect image in 68000 byte order
  187.     ByteEncoded    2            Run-length compression of bytes
  188.     Experimental    16rFFFF        Reserved for testing
  189.  
  190. Sun registered maptype's
  191.  
  192.     Raw        2
  193.  
  194. Sun supported maptype's
  195.  
  196.     None        0                maplength is expected to be 0    
  197.     EqualRGB    1                red[maplength/3], green[], blue[]
  198.  
  199.  
  200. NOTES:
  201.  
  202.     Each line of the image is rounded out to a multiple of 16 bits. This corresponds to the rounding convention used by the memory pixrect package (/usr/include/pixrect/memvar.h) of the SunWindows system. The encoding field (always set to 0 by Sun's supported software) was renamed to length in release 2.0.  As a result, rasterfiles of type 0 generated by the old software claim to have 0 length; for compatibility, code reading rasterfiles must be prepared to compute the true length from the width, height, and depth fields.
  203.  
  204. "! !
  205.  
  206. ScheduledControllers background: (Form readRasterFile: (FileStream oldFileNamed: '/usr/common/include/images/beach.1'))!
  207.  
  208.